package jwt
import (
	"github.com/golang-jwt/jwt/v5"
	"github.com/xinliangnote/go-gin-api/pkg/errors"
	"time"
)
type JwtSt struct{
	UserID               	int64  `json:"user_id"`
	PhoneNumber             string `json:"phone_number"`
	SecretKey				string 
	ExpireTime 				time.Duration
 	jwt.RegisteredClaims        // 内嵌标准的声明
}

type JwtInt interface{
	GenToken() (string, error)
	ParseToken(tokenString string)  error
}

func New(user_id int64, phone_number string, secretkey string, expire_time time.Duration) JwtInt {
	return &JwtSt{	UserID: user_id,
					PhoneNumber:phone_number,
					SecretKey:secretkey,
					ExpireTime:expire_time}
}
func NewMiniJwt(secretkey string) JwtInt{
	return &JwtSt{SecretKey:secretkey}
}
// GenToken 生成JWT
func (data *JwtSt)GenToken() (string, error) {
	// 创建一个我们自己声明的数据
	data.RegisteredClaims = jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(data.ExpireTime)),	// 定义过期时间
			Issuer:    "wesley", // 签发人
		}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, *data)
	// 生成签名字符串
	return token.SignedString([]byte(data.SecretKey))
}

func (data *JwtSt)ParseToken(tokenString string) error {
	// 解析token
	token, err := jwt.ParseWithClaims(tokenString, data, func(token *jwt.Token) (i interface{}, err error) {
		return []byte(data.SecretKey), nil
	})
	if err != nil {
		return err
	}
	// 对token对象中的Claim进行类型断言
	if token.Valid { // 校验token
		return nil
	}
	return errors.New("invalid token")
}